package com.ruoyi.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Date;

/**
 * @Description: 一些时间相关的方法
 * @ClassName: DateUtil
 * @author syc
 * @date: 2022年5月26日 上午9:46:04
 */
public class DateUtil {
	/**
	 * 	时间格式集
	 */
	public static final class Patten {
		/**
		 * 	格式：yyyy-MM-dd HH:mm:ss
		 */
		public static final String DATETIME = "yyyy-MM-dd HH:mm:ss";
		/**
		 * 	格式：yyyy-MM-dd
		 */
		public static final String DATE = "yyyy-MM-dd";
		/**
		 * 	格式：yyyy-MM
		 */
		public static final String MONTH = "yyyy-MM";
		/**
		 * 	格式：HH:mm:ss
		 */
		public static final String TIME = "HH:mm:ss";
		/**
		 * 	格式：yyyyMMddHHmmss
		 */
		public static final String DATETIME_NOSIGN = "yyyyMMddHHmmss";
		/**
		 * 	格式：yyyyMMdd
		 */
		public static final String DATE_NOSIGN = "yyyyMMdd";
		/**
		 * 	格式：yyyyMM
		 */
		public static final String MONTH_NOSIGN = "yyyyMM";
		/**
		 * 	格式：HHmmss
		 */
		public static final String TIME_NOSIGN = "HHmmss";
	}
	
	/**
	 * @Description: 获取系统时间
	 * @author syc
	 * @date: 2022年5月28日 上午11:34:26
	 */
	public static Date getDateTime() {
		return Calendar.getInstance().getTime();
	}
	
	/**
	 * @Description: 获取自定义格式的字符串，指定时间
	 * @author syc
	 * @date: 2022年5月28日 上午11:35:46
	 */
	public static String getCustomChar(Date date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}

	/**
	 * @Description: 获取自定义格式的字符串，当前时间
	 * @author syc
	 * @date: 2022年5月28日 上午11:35:58
	 */
	public static String getCustomChar(String pattern) {
		return getCustomChar(getDateTime(), pattern);
	}
	
	/**
	 * @Description: 取系统日期时间字符串，格式为yyyy-MM-dd HH:mm:ss
	 * @author syc
	 * @date: 2022年5月28日 上午11:36:08
	 */
	public static String getDateTimeChar() {
		return getCustomChar(Patten.DATETIME);
	}

	/**
	 * @Description: 时间转字符串 Date to String
	 * @author syc
	 * @date: 2022年5月26日 上午9:46:48
	 */
	public static String dateToString(Date date, String patten) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(patten);
		return simpleDateFormat.format(date);
	}

	/**
	 * @Description: 字符串转时间 string to Date
	 * @author syc
	 * @date: 2022年5月26日 上午9:47:37
	 */
	public static Date stringToDate(String date, String patten) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(patten);
		Date d = null;
		try {
			d = simpleDateFormat.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return d;
	}

	/**
	 * @Description: 获取当前年份
	 * @author syc
	 * @date: 2022年5月26日 上午10:38:42
	 */
	public static int getYear(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.YEAR);
	}

	/**
	 * @Description: 获取当前服务器时间的时间戳
	 * @author syc
	 * @date: 2022年5月27日 下午4:18:15
	 */
	public static long getTimeMillis() {
		return System.currentTimeMillis();
	}
	
	/**
	 * @Description:时间戳转Date 
	 * @author syc
	 * @date: 2022年6月2日 上午10:20:51
	 */
	public static Date timeMillisToDate(Long timeMillis) {
		return new Date(timeMillis);
	}
	
	/**
	 * @Description:时间戳转时间字符串
	 * @author syc
	 * @date: 2022年6月2日 上午10:20:51
	 */
	public static String timeMillisToString(Long timeMillis, String patten) {
		return  dateToString(timeMillisToDate(timeMillis), patten);
	}
	
	/**
	 * @Description:时间戳转时间字符串
	 * @author syc
	 * @date: 2022年6月2日 上午10:20:51
	 */
	public static String timeMillisToString(Long timeMillis) {
		return timeMillisToString(timeMillis, Patten.DATETIME);
	}
	/**
	 * @Description:获取某个固定时间的时间戳
	 * @author syc
	 * @date: 2022年6月2日 上午10:20:51
	 */
	public static Long getFixedTimeMillis(String time, String patten) {
		 DateFormat df = new SimpleDateFormat(patten);
		 java.util.Date date;
		try {
			date = df.parse(time);
			 Calendar cal = Calendar.getInstance();
		 	 cal.setTime(date);
		 	 return cal.getTimeInMillis();
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * @Description:获取某个固定时间的时间戳(2)
	 * @author syc
	 * @date: 2022年6月2日 上午10:20:51
	 *  这个是另一种方法,可以调整时区
	 */
	public static void getFixedTimeMillis() {
		//可以参考这,但是封装黄方法就算了.
		LocalDateTime time = LocalDateTime.of(2022, 1,1,0,0,0);
    	long second = time.toEpochSecond(ZoneOffset.ofTotalSeconds(8*60*60)); //北京时间
    	// long second = time.toEpochSecond(ZoneOffset.UTC); utc 时间
	}
	
	
	
	
	
	
	
	
//	public static void main(String[] args) {
//		System.out.println(timeMillisToString(1510145000000L)  + "........" + timeMillisToString(810145000000L));     
//	}
	
}
